#ifndef PRODUCERCONSUMER_UTILITIES_HEADER
#define PRODUCERCONSUMER_UTILITIES_HEADER
#include <semaphore.h>
#include <pthread.h>
#include <stdio.h>
#define BUFFER_SIZE 10
#define WAIT_TIME_IN_SECOND 1

typedef struct {
	sem_t mutex; //互斥量，初始值为1,确保每个时刻只有一个生产者或消费者
	sem_t full; //表示共享缓冲区中已被产品填充的个数，消费者在尝试取出产品前必须等待此信号量。如果值为 0，表示缓冲区为空，消费者必须阻塞等待。
	sem_t empty; //表示共享缓冲区中空闲的槽位数。生产者在尝试放入产品前必须等待此信号量。如果值为 0，表示缓冲区已满，生产者必须阻塞等待。
	int producerOffset; //生产者下次放入产品时使用的缓冲区数组索引。
	int consumerOffset; //消费者下次取出产品时使用的缓冲区数组索引
	int remainProducts;
	int buffer[BUFFER_SIZE]; //缓冲区
	int bufferSize; //缓冲区大小
	int exit_flag; //退出标志
}ProducerConsumerManager_t;

typedef struct
{
	ProducerConsumerManager_t *producerConsumerMgr;
	pthread_t tid;
	int threadIdx;
}ThreadStruct_t;

ProducerConsumerManager_t *createProducerConsumerManager();

void initThreadStruct(ThreadStruct_t *threadStruct,
ProducerConsumerManager_t *producerConsumerMgr, int threadIdx);
ThreadStruct_t *createThreadStruct(ProducerConsumerManager_t *producerConsumerMgr, int threadIdx);
void semWait(sem_t *sem);
void semSignal(sem_t *sem);
void semDestroy(sem_t *sem);
#endif
